﻿using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace GIFT
{
    public partial class VentanaComando : Form
    {
        //Constructor de la clase
        public VentanaComando(String nombre, InterfazPrincipal vPrincipal, ArrayList formularios)
        {
            controlComando = new ControlComando();
            modificado = false;
            Principal = vPrincipal;
            Nombre = nombre; //pone el nombre
            InitializeComponent();
            this.Name = Nombre;
            this.Text = Nombre;
            campoNombreComando.Text = Nombre;
            campoActualizacion.Text = DateTime.Now.ToString();
            comandoBusqueda = null;
            comandoMascara = null;
            comandoSinMascara = null;
            comando = null;
            llenarListaFormularios(formularios);
        }

        /******************************* Metodos set *****************************/

        //Le da valor al campo Correlativo Comando
        public void setIdComando(String id)
        {
            campoIdComando.Text = id;
        }

        //Le da valor al campo Nombre Comando
        public void setNombreComando(String nombre)
        {
            campoNombreComando.Text = nombre;
        }

        //Le da valor al campo descripcion Comando
        public void setDescripcionComando(String descripcion)
        {
            campoDescripcionComando.Text = descripcion;
        }

        //Le da valor al campo fecha actualizacion Comando
        public void setActualizacionComando(String actualizacion)
        {
            campoActualizacion.Text = actualizacion;
        }

        //Le da el valor del campo elegido de la lista de nivel de derechos
        public void setValorListaFormulario(String formulario)
        {
            campoFormulario.SelectedItem = formulario;
        }

        //Llena la lista de formularios 
        public void llenarListaFormularios(ArrayList formularios)
        {
            for (int i = 0; i < formularios.Count; ++i)
            {
                campoFormulario.Items.Add(formularios[i].ToString());
            }
        }

        //Escoge el tipo de comando que es
        public void setTipo(String tipo)
        {
            switch (tipo)
            {
                case "con mascara":
                    opcionConMascara.Checked = true;
                    break;
                case "sin mascara":
                    opcionSinMascara.Checked = true;
                    break;
                case "busqueda":
                    opcionBusqueda.Checked = true;
                    break;
            }
            habilitacionOpcionesTipo(false);
        }

        //Llena la lista de componentes que se utilizan en el comando
        public void llenarListaComponentesEnComandoBusqueda(ArrayList componentes)
        {
            for (int i = 0; i < componentes.Count; ++i)
            {
                campoListaComponentesComandoBusqueda.Items.Add(componentes[i].ToString());
            }
        }

        //Limpia la lista de componentes que se utilizan en el comando
        public void limpiarListaComponentesEnComandoBusqueda()
        {
            campoListaComponentesComandoBusqueda.Items.Clear();
        }

        //Agrega un componente a la lista de componentes que se utilizan en el comando
        public void agregarComponenteEnListaComandosBusqueda(String componente)
        {
            campoListaComponentesComandoBusqueda.Items.Add(componente.ToString());
        }

        //Quita un componente a la lista de componentes que se utilizan en el comando
        public void quitarComponenteEnListaComandoBusqueda(String componente)
        {
            campoListaComponentesComandoBusqueda.Items.Remove(componente.ToString());
        }

        //Llena la lista de componentes de los formularios
        public void llenarListaComponentesFormularioBusqueda(ArrayList componentes)
        {
            for (int i = 0; i < componentes.Count; ++i)
            {
                CamposFormulariosBusqueda.Items.Add(componentes[i].ToString());
            }
        }

        //Llena la lista de componentes de los formularios en la desplegable de capo referencia y de modificado
        public void llenarListaComponentesFormularioReferenciaYModificado(ArrayList componentes)
        {
            for (int i = 0; i < componentes.Count; ++i)
            {
                campoCampoRefenciaMascara.Items.Add(componentes[i].ToString());
                campoCampoModificarMascara.Items.Add(componentes[i].ToString());
            }
        }

        //Limpia la lista de componentes de los formularios
        public void limpiarListaComponentesFormulario()
        {
            CamposFormulariosBusqueda.Items.Clear();
        }

        //Le da el valor del campo elegido de la lista de nivel de derechos
        public void setValorListaNivelDerechos(String nivelDerecho)
        {
            campoNivelDerechosSinMascara.SelectedItem = nivelDerecho;
        }

        //Le da valor al campo comando con mascara
        public void setComandoMascara(ComandoMascara Cmd)
        {
            comandoMascara = Cmd;
            setTipo("con mascara");
            llenarDatosBasicosConMascara();
            llenarDatosConMascara();
        }

        //Le da valor al campo comando sin mascara
        public void setComandoSinMascara(ComandoSinMascara Cmd)
        {
            comandoSinMascara = Cmd;
            setTipo("sin mascara");
            llenarDatosBasicosSinMascara();
            llenarDatosSinMascara();
        }

        //Le da valor al campo comando busqueda
        public void setComandoBusqueda(ComandoBusqueda Cmd)
        {
            comandoBusqueda = Cmd;
            setTipo("busqueda");
            llenarDatosBasicosBusqueda();
            llenarDatosBusqueda();
        }

        //Le da valor al campo comando 
        public void setComando(Comando Cmd)
        {
            comando = Cmd;
            setNombreComando(comando.getNombre());
            setDescripcionComando(comando.getdescripcion());
            setActualizacionComando(comando.getFechaActualizacion());

        }

        //CAmbia la habilitacion de los campos de opciones de tipo de mascara
        private void habilitacionOpcionesTipo(bool habilitacion)
        {
            opcionBusqueda.Enabled = habilitacion;
            opcionConMascara.Enabled = habilitacion;
            opcionSinMascara.Enabled = habilitacion;
        }

        /******************************* Metodos get *****************************/
        
        //Retorna el valor del campo Correlativo Comando
        public String getIdComando()
        {
            return campoIdComando.Text;
        }

        //Retorna el valor del campo Nombre Comando
        public String getNombreComando()
        {
            return campoNombreComando.Text;
        }

        //Retorna el valor del campo descripcion Comando
        public String getDescripcionComando()
        {
            return campoDescripcionComando.Text;
        }

        //Retorna el valor del campo fecha actualizacion Comando
        public String getActualizacionComando()
        {
            return campoActualizacion.Text;
        }

        //Retorna el tipo de comando que es
        public String getTipo()
        {
            if (opcionConMascara.Checked){return "con mascara";}
            if (opcionSinMascara.Checked){return "sin mascara";}
            if (opcionBusqueda.Checked  ){return "busqueda";   }
            return "";
        }

        //Retorna el valor del campo elegido de la lista de componentes en el comando
        public String getValorListaComponentesComando()
        {
            return campoListaComponentesComandoBusqueda.Text;
        }

        //Retorna el valor del campo elegido de la lista de componentes de los formularios
        public String getValorComponentesFormulario()
        {
            return CamposFormulariosBusqueda.Text;
        }

        //Retorna el valor del campo elegido de la lista de formularios
        public String getValorListaFormulario()
        {
            return campoFormulario.Text;
        }

        //Retorna el valor del campo elegido de la lista de nivel de derechos
        public String getValorListaNivelDerechos()
        {
            return campoNivelDerechosSinMascara.Text;
        }

        //Retorna el valor al campo comando con mascara
        public ComandoMascara getComandoMascara()
        {
            return comandoMascara;
        }

        //Retorna el valor al campo comando sin mascara
        public ComandoSinMascara getComandoSinMascara()
        {
            return comandoSinMascara;
        }

        //Retorna el valor al campo comando busqueda
        public ComandoBusqueda getComandoBusqueda()
        {
            return comandoBusqueda;
        }

        //Retorna la lista de mascaras del comando
        public ArrayList getListaMascaras()
        {
            ArrayList mascaras = new ArrayList();
            for (int i = 0; i < campoListaComponentesComandoMascara.Items.Count; ++i)
            {
                mascaras.Add(campoListaComponentesComandoMascara.Items[i].ToString());
            }
            return mascaras;
        }

        //Retorna la lista de filtros de busqueda del comando
        public ArrayList getListaFiltros()
        {
            ArrayList fltros = new ArrayList();
            for (int i = 0; i < campoListaComponentesComandoBusqueda.Items.Count; ++i)
            {
                fltros.Add(campoListaComponentesComandoBusqueda.Items[i].ToString());
            }
            return fltros;
        }

        /******************************* Captura de eventos *****************************/

        //Cambia la habilitacion del boton guardar
        public void habilitacionBotonGuardar(bool habilitacion)
        {
            botonGuardar.Enabled = habilitacion;
        }

        //Captura el click en el boton cerrar de una pestana
        private void botonCerrar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        //Captura el click en el boton borrar de una pestana
        private void botonEliminar_Click(object sender, EventArgs e)
        {
            borrarArchivo();
        }

        //Captura el click en el boton guardar de una pestana
        private void botonGuardar_Click(object sender, EventArgs e)
        {
            guardarArchivo();//manda a guardar el archivo
        }

        //Captura el click en el boton guardarComo de una pestana
        private void botonGuardarComo_Click(object sender, EventArgs e)
        {
            hacerCopia();
        }

        //Se da cuenta cuando se hicieron cambios
        private void seHicieronCambios(object sender, EventArgs e)
        {
            if (Principal.estaAbierta(Nombre))
            {
                this.modificado = true;
                botonGuardar.Enabled = true;
            }
        }

        //Se da cuenta cuando se hicieron cambios
        public void seHicieronCambios(object sender, System.Windows.Forms.KeyPressEventArgs e)
        {
            if (Principal.estaAbierta(Nombre))
            {
                this.modificado = true;
                botonGuardar.Enabled = true;
            }
        }


        //Captura el evento que suceda antes de cerrar la ventana
        private void click_cerrarVentana(object sender, FormClosingEventArgs e)
        {
            if (modificado)
            {
                guardarArchivo();
            }
            Principal.ventanaEnfocada(null, ""); //Manda a quitarse como la enfocada
        }

        //Captura el evento del click en con mascara
        private void cambioOpcionConMascara(object sender, EventArgs e)
        {
            if (opcionConMascara.Checked)
            {
                groupBox_DatosEspecificos.Visible = true;
                panelConMascara.Visible = true;
                panelSinMascara.Visible = false;
                panelBusqueda.Visible = false;
                setTipo("con mascara");
                if (comando != null)
                {
                    comandoMascara = new ComandoMascara(getNombreComando(), comando.getdescripcion(), comando.getFechaActualizacion(), comando.getId(), comando.getIdFormulario());
                    comando = null;
                }
            }
            else
            {
                panelConMascara.Visible = false;
            }
            campoFormulario.Enabled = (campoFormulario.SelectedIndex == -1) ? true : false;//deshabilitar la escogencia de formularios si ya se eligio uno
            
            habilitacionOpcionesTipo(false);
            seHicieronCambios(null, null); //Anuncia que se hicieron cambios
        }

        //Captura el evento del click en sin mascara
        private void cambioOpcionSinMascara(object sender, EventArgs e)
        {
            
            if (opcionSinMascara.Checked)
            {
                groupBox_DatosEspecificos.Visible = true;
                panelSinMascara.Visible = true;
                panelConMascara.Visible = false;
                panelBusqueda.Visible = false;
                setTipo("sin mascara");
                if (comando != null)
                {
                    comandoSinMascara = new ComandoSinMascara(getNombreComando(), comando.getdescripcion(), comando.getFechaActualizacion(), comando.getId(), comando.getIdFormulario());
                    comando = null;
                }
            }
            else
            {
                panelSinMascara.Visible = false;
            }
            campoFormulario.Enabled = (campoFormulario.SelectedIndex == -1) ? true : false;//deshabilitar la escogencia de formularios si ya se eligio uno            
            habilitacionOpcionesTipo(false);
            seHicieronCambios(null, null); //Anuncia que se hicieron cambios
        }

        //Captura el evento del click en busqueda
        private void cambioOpcionBusqueda(object sender, EventArgs e)
        {
            if (opcionBusqueda.Checked)
            {
                groupBox_DatosEspecificos.Visible = true;
                panelBusqueda.Visible = true;
                panelSinMascara.Visible = false;
                panelConMascara.Visible = false;
                setTipo("busqueda");

                if (comando != null)
                {
                    comandoBusqueda = new ComandoBusqueda(getNombreComando(), comando.getdescripcion(), comando.getFechaActualizacion(), comando.getId(), comando.getIdFormulario());
                    comando = null;
                }
            }
            else
            {
                panelBusqueda.Visible = false;
            }
            campoFormulario.Enabled = (campoFormulario.SelectedIndex == -1) ? true : false;//deshabilitar la escogencia de formularios si ya se eligio uno            
            habilitacionOpcionesTipo(false);
            seHicieronCambios(null, null); //Anuncia que se hicieron cambios
        }


        //Captura el evento del click en guardar valores de mascara
        private void botonGuardarValoresCamposMascara_Click(object sender, EventArgs e)
        {
            if (campoCampoRefenciaMascara.Text != "" && campoValorPrevioCampoMascara.Text != "" && campoValorPosteriorCampoMascara.Text != "" && campoCampoModificarMascara.Text != "" && getValorListaFormulario() != "" && campoNombreMascara.Text != "")
            {
                if (!controlComando.existeMascaraNombre(campoNombreMascara.Text) && !comandoMascara.existeMascara(campoNombreMascara.Text))
                {
                    botonGuardarValoresCamposMascara.Enabled = false;
                    String idTipoCampoReferencia = new ControlFormulario().obtieneAtributoEspecificoComponenteFormulario(campoCampoRefenciaMascara.Text, "id", getValorListaFormulario());
                    String idTipoCampoModificar = new ControlFormulario().obtieneAtributoEspecificoComponenteFormulario(campoCampoModificarMascara.Text, "id", getValorListaFormulario());
                    Mascara nueva = new Mascara(comandoMascara.getId(), idTipoCampoReferencia, idTipoCampoModificar, campoNombreMascara.Text);
                    nueva.setValorPosterior(campoValorPosteriorCampoMascara.Text);
                    nueva.setValorPrevio(campoValorPrevioCampoMascara.Text);
                    nueva.setNombre(campoNombreMascara.Text);
                    comandoMascara.agregarMascara(nueva);
                    campoListaComponentesComandoMascara.Items.Add(nueva.getNombre());
                    campoNombreMascara.Text = "";
                    campoCampoRefenciaMascara.SelectedIndex = -1;
                    campoValorPrevioCampoMascara.SelectedIndex = -1;
                    campoCampoModificarMascara.SelectedIndex = -1;
                    campoValorPosteriorCampoMascara.SelectedIndex = -1;
                    escogerFechaValorPrevio.Visible = escogerFechaValorPosterior.Visible = false;
                    campoValorPrevioCampoMascara.Visible = campoValorPosteriorCampoMascara.Visible = true;
                    seHicieronCambios(null, null);
                }
                else
                {
                    MessageBox.Show("Nombre Incorrecto!\n Ya existe una mascara con este nombre"); //Informa
                }
            }
            else
            {
                MessageBox.Show("Faltan Datos!"); //Informa
            }
        }

        //Captura el evento del click en los campos del formulario
        private void cambioListaCamposFormulario(object sender, EventArgs e)
        {
            if (campoListaComponentesComandoBusqueda.Text != "")
            {
                botonQuitarCampo.Enabled = true;
                CamposFormulariosBusqueda.SelectedItem = campoListaComponentesComandoBusqueda.Text;
            }
            else
            {
                botonQuitarCampo.Enabled = false;
            }
        }

        //Captura el evento del click en los campos del formulario
        private void campoCampoComando_SelectedIndexChanged(object sender, EventArgs e)
        {
            //Si existe 
            if (CamposFormulariosBusqueda.SelectedItem != null && campoListaComponentesComandoBusqueda.Items.Contains(CamposFormulariosBusqueda.SelectedItem))
            {
                campoListaComponentesComandoBusqueda.SelectedItem = CamposFormulariosBusqueda.SelectedItem;
                botonAnadirABusqueda.Enabled = false;
            }
            else
            {
                campoListaComponentesComandoBusqueda.SelectedIndex = -1;
                if (CamposFormulariosBusqueda.SelectedItem != null)
                {
                    botonAnadirABusqueda.Enabled = true;
                }

            }
        }

        //Captura el evento del click en el boton quitar campo
        private void botonQuitarCampo_Click(object sender, EventArgs e)
        {
            FiltroBusqueda filtro = comandoBusqueda.buscarFiltroComponente(campoListaComponentesComandoBusqueda.Text);
            if (filtro != null)
            {
                controlComando.eliminarFiltroBusqueda(filtro.getId());
            }
            comandoBusqueda.quitarFiltro(campoListaComponentesComandoBusqueda.Text);
            campoListaComponentesComandoBusqueda.Items.Remove(campoListaComponentesComandoBusqueda.Text);
            botonQuitarCampo.Enabled = false;
            campoListaComponentesComandoBusqueda.SelectedIndex = -1;
            botonAnadirABusqueda.Enabled = true;
            seHicieronCambios(null, null); //Anuncia que se hicieron cambios
        }

        //Captura el evento de cuando la ventana es enfocada
        private void VentanaEnfocada(object sender, EventArgs e)
        {
            Principal.ventanaEnfocada(this, "comando"); //Manda a ponerse como la enfocada
        }

        //Captura el evento de cuando la ventana es desenfocada
        private void VentanaDesenfocada(object sender, EventArgs e)
        {
            Principal.ventanaEnfocada(null, ""); //Manda a quitarse como la enfocada
        }

        //Captura el evento de anadir componentes sin mascara
        private void botonAnadirComponenteBusqueda_Click(object sender, EventArgs e)
        {
            if (CamposFormulariosBusqueda.Text != "" && getValorListaFormulario() != "")
            {
                String idCampo = new ControlFormulario().obtieneAtributoEspecificoComponenteFormulario(CamposFormulariosBusqueda.Text, "id", getValorListaFormulario());
                FiltroBusqueda nuevo = new FiltroBusqueda(comandoBusqueda.getId(), idCampo);
                comandoBusqueda.agregarFiltro(nuevo);
                agregarComponenteEnListaComandosBusqueda(getValorComponentesFormulario());
                botonAnadirABusqueda.Enabled = false;
                campoListaComponentesComandoBusqueda.SelectedIndex = -1;
                seHicieronCambios(null, null); //Anuncia que se hicieron cambios
            }
            else
            {
                MessageBox.Show("Campos invalidos!"); //Informa
            }
        }

        //Captura el evento de establecer el nivel de derechos
        private void botonEstablecerDerechosSinMascara_Click(object sender, EventArgs e)
        {
            botonEstablecerDerechosSinMascara.Enabled = false;
            comandoSinMascara.setNivelDerechos(getValorListaNivelDerechos());
            seHicieronCambios(null, null); //Anuncia que se hicieron cambios
        }

        //Captura el evento de cambio del nivel de derechos
        private void campoNivelDerechosSinMascara_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (Principal.estaAbierta(Nombre))
            {
                botonEstablecerDerechosSinMascara.Enabled = true;
            }
        }

        //Captura el evento de cambio el campo de referencia
        private void campoCampoRefenciaMascara_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (campoCampoRefenciaMascara.Text != "")
            {
                campoValorPrevioCampoMascara.Enabled = true;
                cargaValoresPreviosMascara(campoCampoRefenciaMascara.Text);
            }
            else
            {
                campoValorPrevioCampoMascara.Enabled = false;
                botonGuardarValoresCamposMascara.Enabled = false;
            }
            campoNombreMascara.Text = "";
        }

        //Carga los valores previos correspondientes segun el tipo de campo
        private void cargaValoresPreviosMascara(String componente)
        {
            String tipoDelCampo = new ControlFormulario().obtenerTipoDeComponente(componente, getValorListaFormulario());
            campoValorPrevioCampoMascara.Items.Clear();
            campoValorPrevioCampoMascara.Visible = true;
            escogerFechaValorPrevio.Visible = false;
            if (tipoDelCampo != "")
            {
                switch (tipoDelCampo)
                {
                    case "numero":
                        campoValorPrevioCampoMascara.Items.AddRange(controlComando.getSintaxisNumero().ToArray());
                        break;
                    case "binario":
                        campoValorPrevioCampoMascara.Items.Add("0");
                        campoValorPrevioCampoMascara.Items.Add("1");
                        break;
                    case "texto":
                        campoValorPrevioCampoMascara.Items.AddRange(controlComando.getSintaxisTexto().ToArray());
                        break;
                    case "incremental":
                        campoValorPrevioCampoMascara.Items.AddRange(controlComando.getSintaxisNumero().ToArray());
                        break;
                    case "fechaHora":
                        campoValorPrevioCampoMascara.Visible = false;
                        escogerFechaValorPrevio.Visible = true;
                        campoValorPrevioCampoMascara.Items.Add("error");
                        campoValorPrevioCampoMascara.SelectedIndex = 0;
                        break;
                    case "lista":
                        String idTipoCampo = new ControlFormulario().obtieneAtributoEspecificoComponenteFormulario(componente, "[id tipo campo]", getValorListaFormulario());
                        String idLista = new ControlFormulario().obtieneAtributoEspecificoTabla("Tipo Campo Componente", "id lista", "id", idTipoCampo);
                        ArrayList valoresLista = new ControlLista().obtieneTerminosLista(idLista);
                        campoValorPrevioCampoMascara.Items.AddRange(valoresLista.ToArray());
                        break;
                    case "jerarquia":
                        String idTipoCampoJer = new ControlFormulario().obtieneAtributoEspecificoComponenteFormulario(componente, "[id tipo campo]", getValorListaFormulario());
                        String idJerarquia = new ControlFormulario().obtieneAtributoEspecificoTabla("Tipo Campo Componente", "id jerarquia", "id", idTipoCampoJer);
                        ArrayList terminosJerarquia = new ControlJerarquia().obtieneTerminosJerarquia(idJerarquia);
                        campoValorPrevioCampoMascara.Items.AddRange(terminosJerarquia.ToArray());
                        break;
                }
            }
        }

        //Captura el evento de cambio el campo de modificacion
        private void campoCampoModificarMascara_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (campoCampoModificarMascara.Text != "")
            {
                campoValorPosteriorCampoMascara.Enabled = true;
                cargaValoresPosterioresMascara(campoCampoModificarMascara.Text);
            }
            else
            {
                campoValorPosteriorCampoMascara.Enabled = false;
                botonGuardarValoresCamposMascara.Enabled = false;
            }
            campoNombreMascara.Text = "";
        }

        //Carga los valores previos correspondientes segun el tipo de campo
        private void cargaValoresPosterioresMascara(String componente)
        {
            String tipoDelCampo = new ControlFormulario().obtenerTipoDeComponente(componente, getValorListaFormulario());
            campoValorPosteriorCampoMascara.Items.Clear();
            campoValorPosteriorCampoMascara.Visible = true;
            escogerFechaValorPosterior.Visible = false;
            if (tipoDelCampo != "")
            {
                switch (tipoDelCampo)
                {
                    case "numero":
                        campoValorPosteriorCampoMascara.Items.AddRange(controlComando.getSintaxisNumero().ToArray());
                        break;
                    case "binario":
                        campoValorPosteriorCampoMascara.Items.Add("0");
                        campoValorPosteriorCampoMascara.Items.Add("1");
                        break;
                    case "texto":
                        campoValorPosteriorCampoMascara.Items.AddRange(controlComando.getSintaxisTexto().ToArray());
                        break;
                    case "incremental":
                        campoValorPosteriorCampoMascara.Items.AddRange(controlComando.getSintaxisNumero().ToArray());
                        break;
                    case "fechaHora":
                        campoValorPosteriorCampoMascara.Visible = false;
                        escogerFechaValorPosterior.Visible = true;
                        campoValorPrevioCampoMascara.Items.Add("error");
                        campoValorPrevioCampoMascara.SelectedIndex = 0;
                        break;
                    case "lista":
                        String idTipoCampo = new ControlFormulario().obtieneAtributoEspecificoComponenteFormulario(componente, "[id tipo campo]", getValorListaFormulario());
                        String idLista = new ControlFormulario().obtieneAtributoEspecificoTabla("Tipo Campo Componente", "id lista", "id", idTipoCampo);
                        ArrayList valoresLista = new ControlLista().obtieneTerminosLista(idLista);
                        campoValorPosteriorCampoMascara.Items.AddRange(valoresLista.ToArray());
                        break;
                    case "jerarquia":
                        String idTipoCampoJer = new ControlFormulario().obtieneAtributoEspecificoComponenteFormulario(componente, "[id tipo campo]", getValorListaFormulario());
                        String idJerarquia = new ControlFormulario().obtieneAtributoEspecificoTabla("Tipo Campo Componente", "id jerarquia", "id", idTipoCampoJer);
                        ArrayList terminosJerarquia = new ControlJerarquia().obtieneTerminosJerarquia(idJerarquia);
                        campoValorPosteriorCampoMascara.Items.AddRange(terminosJerarquia.ToArray());
                        break;
                }
            }
        }

        private void campoValorPrevioCampoMascara_SelectedIndexChanged(object sender, EventArgs e)
        {
            campoNombreMascara.Text = "";
        }

        private void campoValorPosteriorCampoMascara_SelectedIndexChanged(object sender, EventArgs e)
        {
            campoNombreMascara.Text = "";
        }


        private void campoListaComponentesComandoMascara_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (campoListaComponentesComandoMascara.Text != "")
            {
                butonQuitarMascara.Enabled = true;
                ArrayList mascaras = comandoMascara.getMascaras();
                int indice = -1;
                for (int i = 0; i < mascaras.Count; ++i)
                {
                    if (((Mascara)mascaras[i]).getNombre() == campoListaComponentesComandoMascara.Text)
                    {
                        indice = i;
                        break;
                    }
                }
                String idPrevio = ((Mascara)mascaras[indice]).getIdTipoCampoReferencia();
                campoCampoRefenciaMascara.Text = new ControlFormulario().obtieneAtributoEspecificoTabla("componente_formulario", "nombre", "id", idPrevio);
                campoValorPrevioCampoMascara.Text = ((Mascara)mascaras[indice]).getValorPrevio();
                String idPosterior = ((Mascara)mascaras[indice]).getIdTipoCampoModificado();
                campoCampoModificarMascara.Text = new ControlFormulario().obtieneAtributoEspecificoTabla("componente_formulario", "nombre", "id", idPosterior);
                campoValorPosteriorCampoMascara.Text = ((Mascara)mascaras[indice]).getValorPosterior();
                campoNombreMascara.Text = ((Mascara)mascaras[indice]).getNombre();
                botonGuardarValoresCamposMascara.Enabled = false;
            }
            else
            {
                butonQuitarMascara.Enabled = false;
                campoNombreMascara.Text = "";
            }
        }

        private void butonQuitarMascara_Click(object sender, EventArgs e)
        {
            butonQuitarMascara.Enabled = false;
            comandoMascara.quitarMascara(campoListaComponentesComandoMascara.Text);
            controlComando.eliminarMascara(campoListaComponentesComandoMascara.Text);
            campoListaComponentesComandoMascara.Items.Remove(campoListaComponentesComandoMascara.Text);
            campoCampoRefenciaMascara.SelectedIndex = -1;
            campoValorPrevioCampoMascara.SelectedIndex = -1;
            campoCampoModificarMascara.SelectedIndex = -1; 
            campoValorPosteriorCampoMascara.SelectedIndex = -1;
            campoNombreMascara.Text = "";
            escogerFechaValorPrevio.Visible = escogerFechaValorPosterior.Visible = false;
            campoValorPrevioCampoMascara.Visible = campoValorPosteriorCampoMascara.Visible = true;
            seHicieronCambios(null, null);
        }

        //Captura el evento de cambio de indice en la lista de formoularios 
        private void campoFormulario_SelectedIndexChanged(object sender, EventArgs e)
        {
            String idFormulario = new ControlFormulario().obtieneAtributoEspecificoTabla("formulario", "numero", "nombre", "'" + getValorListaFormulario() + "'");
            if (comando != null)
            {
                comando.setIdFormulario(idFormulario);
            }
            else
            {
                if (comandoMascara != null)
                {
                    comandoMascara.setIdFormulario(idFormulario);
                }
                else
                {
                    if (comandoSinMascara != null)
                    {
                        comandoSinMascara.setIdFormulario(idFormulario);
                    }
                    else
                    {
                        if (comandoBusqueda != null)
                        {
                            comandoBusqueda.setIdFormulario(idFormulario);
                        }
                    }
                }
            }
            llenarListaComponentesFormularioBusqueda(new ControlFormulario().cargaComponentes_para_comandos(getValorListaFormulario()));
            llenarListaComponentesFormularioReferenciaYModificado(new ControlFormulario().cargaComponentes_para_comandos(getValorListaFormulario()));
            campoFormulario.Enabled = (opcionBusqueda.Checked || opcionConMascara.Checked || opcionSinMascara.Checked) ? false : true;
        }

        /******************************* Metodos de la logica de comando *************************/

        //Manda a guardar un archivo
        public void guardarArchivo()
        {
            DialogResult dr = MessageBox.Show("Desea guardar los cambios de " + Nombre +"?", "Guardar", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            switch (dr)
            {
                case DialogResult.Yes: //en caso de que desee guardar
                    
                    switch (getTipo())
                    {
                        case "con mascara":
                            if (comandoMascara.getIdFormulario() == "-1")
                            {
                                MessageBox.Show("No ha elegido un formulario!"); //Informa
                            }
                            else
                            {
                                comandoMascara.setdescripcion(getDescripcionComando());
                                if (!controlComando.guardarConMascara(comandoMascara))
                                {
                                    TreeNode tnode = new TreeNode(Nombre);
                                    Principal.GetTreeView().Nodes[0].Nodes[2].Nodes.Add(tnode); //Agrega el nodo
                                }
                                setActualizacionComando(DateTime.Now.ToString());
                                modificado = false;
                                botonGuardar.Enabled = false;
                            }
                            return;
                        case "sin mascara":
                            if (comandoSinMascara.getIdFormulario() == "-1")
                            {
                                MessageBox.Show("No ha elegido un formulario!"); //Informa
                            }
                            else
                            {
                                comandoSinMascara.setdescripcion(getDescripcionComando());
                                if(!controlComando.guardarSinMascara(comandoSinMascara))
                                {
                                    TreeNode tnode = new TreeNode(Nombre);
                                    Principal.GetTreeView().Nodes[0].Nodes[2].Nodes.Add(tnode); //Agrega el nodo
                                }
                                setActualizacionComando(DateTime.Now.ToString());
                                modificado = false;
                                botonGuardar.Enabled = false;
                            }
                            return;
                        case "busqueda":
                            if (comandoBusqueda.getIdFormulario() == "-1")
                            {
                                MessageBox.Show("No ha elegido un formulario!"); //Informa
                            }
                            else
                            {
                                comandoBusqueda.setdescripcion(getDescripcionComando());
                                if (!controlComando.guardarBusqueda(comandoBusqueda))
                                {
                                    TreeNode tnode = new TreeNode(Nombre);
                                    Principal.GetTreeView().Nodes[0].Nodes[2].Nodes.Add(tnode); //Agrega el nodo
                                }
                                setActualizacionComando(DateTime.Now.ToString());
                                modificado = false;
                                botonGuardar.Enabled = false;
                            }
                            return;
                    }
                    MessageBox.Show("No ha elegido un tipo!"); //Informa
                        break;
                case DialogResult.No: break;
            }
        }

        //Manda a hacer una copia del numero
        public void hacerCopia()
        {
            GuardarComo guardar = new GuardarComo(Principal, "comando", this);
            guardar.Show();
        }

        //Manda a borrar el archivo
        public void borrarArchivo()
        {
            //confirma el borrado
            DialogResult dr = MessageBox.Show("Está seguro que desea borrar el comando?", "Borrar comando", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            switch (dr)
            {
                case DialogResult.Yes: //en caso de que desee borrarlo
                    controlComando.borrar(Nombre);
                    Principal.habilitacionCampos();
                    Principal.GetControlInterfaz().quitarNodo(Principal.GetTreeView(), Nombre, "comando");
                    this.Close();
                    break;
                case DialogResult.No: break;
            }
        }

        //Llena los datos basicos de un comando
        private void llenarDatosBasicosConMascara()
        {
            setIdComando((comandoMascara.getId()).ToString());
            setNombreComando(comandoMascara.getNombre());
            setDescripcionComando(comandoMascara.getdescripcion());
            setActualizacionComando(comandoMascara.getFechaActualizacion());
            String nombreForm = new ControlFormulario().obtieneAtributoEspecificoTabla("formulario", "nombre", "numero", (comandoMascara.getIdFormulario()).ToString());
            setValorListaFormulario(nombreForm);
        }

        //Llena los datos basicos de un comando
        private void llenarDatosBasicosSinMascara()
        {
            setIdComando((comandoSinMascara.getId()).ToString());
            setNombreComando(comandoSinMascara.getNombre());
            setDescripcionComando(comandoSinMascara.getdescripcion());
            setActualizacionComando(comandoSinMascara.getFechaActualizacion());
            String nombreForm = new ControlFormulario().obtieneAtributoEspecificoTabla("formulario", "nombre", "numero", (comandoSinMascara.getIdFormulario()).ToString());
            setValorListaFormulario(nombreForm);
        }

        //Llena los datos basicos de un comando
        private void llenarDatosBasicosBusqueda()
        {
            setIdComando((comandoBusqueda.getId()).ToString());
            setNombreComando(comandoBusqueda.getNombre());
            setDescripcionComando(comandoBusqueda.getdescripcion());
            setActualizacionComando(comandoBusqueda.getFechaActualizacion());
            String nombreForm = new ControlFormulario().obtieneAtributoEspecificoTabla("formulario", "nombre", "numero", (comandoBusqueda.getIdFormulario()).ToString());
            setValorListaFormulario(nombreForm);
        }

        //Llena los datos de un comando sin mascara
        private void llenarDatosSinMascara()
        {
            setTipo("sin mascara");
            setValorListaNivelDerechos(comandoSinMascara.getNivelDerechos());
        }

        //Llena los datos de un comando con mascara
        private void llenarDatosConMascara()
        {
            setTipo("con mascara");
            ArrayList mascaras = getComandoMascara().getMascaras();
            for (int i = 0; i < mascaras.Count; ++i)
            {
                campoListaComponentesComandoMascara.Items.Add(((Mascara)mascaras[i]).getNombre());
            }
        }

        //Llena los datos de un comando de busqueda
        private void llenarDatosBusqueda()
        {
            setTipo("busqueda");
            ArrayList filtros = getComandoBusqueda().getFiltros();
            for (int i = 0; i < getComandoBusqueda().getFiltros().Count; ++i)
            {
                agregarComponenteEnListaComandosBusqueda(new ControlFormulario().obtieneAtributoEspecificoTabla("componente_formulario", "nombre", "id", ((FiltroBusqueda)filtros[i]).getIdTipoCampo()));
            }
        }

        //Captura el evento de cambio de valor en el campo de nombre de mascara
        private void campoNombreMascara_TextChanged(object sender, EventArgs e)
        {
            if (campoNombreMascara.Text != "" && campoValorPrevioCampoMascara.Text != "" && campoValorPosteriorCampoMascara.Text != "")
            {
                botonGuardarValoresCamposMascara.Enabled = true;
            }
            else
            {
                botonGuardarValoresCamposMascara.Enabled = false;
            }
        }

        //Captura el evento de cambio de visibilidad en el campo de escoger fecha para valor previo
        private void escogerFechaValorPrevio_VisibleChanged(object sender, EventArgs e)
        {
            if (escogerFechaValorPrevio.Visible)
            {
                campoValorPrevioCampoMascara.Items.Add(escogerFechaValorPrevio.Text);
                campoValorPrevioCampoMascara.Text = escogerFechaValorPrevio.Text;
            }
        }

        //Captura el evento de cambio de valor en el campo de escoger fecha para valor previo
        private void escogerFechaValorPrevio_ValueChanged(object sender, EventArgs e)
        {
            if (escogerFechaValorPrevio.Visible)
            {
                campoValorPrevioCampoMascara.Items.Add(escogerFechaValorPrevio.Text);
                campoValorPrevioCampoMascara.Text = escogerFechaValorPrevio.Text;
            }
        }

        //Captura el evento de cambio de valor en el campo de escoger fecha para valor posterior
        private void escogerFechaValorPosterior_ValueChanged(object sender, EventArgs e)
        {
            if (escogerFechaValorPosterior.Visible)
            {
                campoValorPosteriorCampoMascara.Items.Add(escogerFechaValorPosterior.Text);
                campoValorPosteriorCampoMascara.Text = escogerFechaValorPosterior.Text;
            }
        }

        //Captura el evento de cambio de visibilidad en el campo de escoger fecha para valor posterior
        private void escogerFechaValorPosterior_VisibleChanged(object sender, EventArgs e)
        {
            if (escogerFechaValorPosterior.Visible)
            {
                campoValorPosteriorCampoMascara.Items.Add(escogerFechaValorPosterior.Text);
                campoValorPosteriorCampoMascara.Text = escogerFechaValorPosterior.Text;
            }
        }

        


    }//Fin de la clase
}
